package main

import (
	"fmt"
	"sync"
	"time"
)

/*
sync包里包含的struct以及其功能
sync.Mutex: 互斥量(锁)，主要是处理多个goroutine竞争同一个资源时候的同步问题。
sync.RWMutex: 读写互斥量(锁)，相对Mutex而言能进行更细腻的控制，主要用在读多写少的情景下。
sync.WaitGroup: WaitGroup用于等待一组goroutine结束。
sync.Cond:实现一个条件变量，即等待或宣布事件发生的goroutines的会合点。
sync.Pool:临时对象池，作为临时对象的保存和复用的集合。
sync.Once:顾名思义，Once可以使得函数的调用只执行一次。
*/

func main() {
	wg := sync.WaitGroup{}
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			fmt.Printf("goroutine %d starts sleep\n", i)
			time.Sleep(time.Second * time.Duration(i))
			fmt.Printf("goroutine %d finished sleep\n", i)
		}(i)
	}
	fmt.Println("wait group waiting...")
	wg.Wait()
	fmt.Println("wait group waitint finished")
}
